package com.campus.food.service;

import com.campus.food.model.entity.Order;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 订单服务接口
 * 
 * @author Claude3.7 Sonnet
 * @since 2025-05-29
 */
public interface OrderService {
    
    /**
     * 创建订单
     * @param order 订单信息
     * @return 创建成功的订单
     */
    Order createOrder(Order order);
    
    /**
     * 根据ID查询订单
     * @param id 订单ID
     * @return 订单信息
     */
    Order getOrderById(Long id);
    
    /**
     * 根据订单号查询订单
     * @param orderNo 订单号
     * @return 订单信息
     */
    Order getOrderByOrderNo(String orderNo);
    
    /**
     * 更新订单信息
     * @param order 订单信息
     * @return 更新结果
     */
    boolean updateOrder(Order order);
    
    /**
     * 更新订单状态
     * @param id 订单ID
     * @param status 订单状态
     * @return 更新结果
     */
    boolean updateOrderStatus(Long id, Integer status);
    
    /**
     * 支付订单
     * @param id 订单ID
     * @param paymentMethod 支付方式
     * @return 支付结果
     */
    boolean payOrder(Long id, Integer paymentMethod);
    
    /**
     * 确认订单（商家操作）
     * @param id 订单ID
     * @param merchantId 商家ID（用于权限验证）
     * @return 确认结果
     */
    boolean confirmOrder(Long id, Long merchantId);
    
    /**
     * 开始配送（商家操作）
     * @param id 订单ID
     * @param merchantId 商家ID（用于权限验证）
     * @return 配送结果
     */
    boolean startDelivery(Long id, Long merchantId);
    
    /**
     * 完成订单（用户确认收货）
     * @param id 订单ID
     * @param userId 用户ID（用于权限验证）
     * @return 完成结果
     */
    boolean completeOrder(Long id, Long userId);
    
    /**
     * 取消订单
     * @param id 订单ID
     * @param cancelReason 取消原因
     * @param operatorId 操作者ID
     * @return 取消结果
     */
    boolean cancelOrder(Long id, String cancelReason, Long operatorId);
    
    /**
     * 删除订单
     * @param id 订单ID
     * @return 删除结果
     */
    boolean deleteOrder(Long id);
    
    /**
     * 分页查询用户订单列表
     * @param userId 用户ID
     * @param page 页码
     * @param size 每页大小
     * @param status 订单状态（可选）
     * @return 订单列表
     */
    List<Order> getUserOrders(Long userId, int page, int size, Integer status);
    
    /**
     * 查询用户订单总数
     * @param userId 用户ID
     * @param status 订单状态（可选）
     * @return 订单总数
     */
    long getUserOrderCount(Long userId, Integer status);
    
    /**
     * 分页查询商家订单列表
     * @param merchantId 商家ID
     * @param page 页码
     * @param size 每页大小
     * @param status 订单状态（可选）
     * @return 订单列表
     */
    List<Order> getMerchantOrders(Long merchantId, int page, int size, Integer status);
    
    /**
     * 查询商家订单总数
     * @param merchantId 商家ID
     * @param status 订单状态（可选）
     * @return 订单总数
     */
    long getMerchantOrderCount(Long merchantId, Integer status);
    
    /**
     * 分页查询所有订单列表（管理员专用）
     * @param page 页码
     * @param size 每页大小
     * @param orderNo 订单号（可选）
     * @param status 订单状态（可选）
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @return 订单列表
     */
    List<Order> getAllOrders(int page, int size, String orderNo, Integer status, LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 查询所有订单总数（管理员专用）
     * @param orderNo 订单号（可选）
     * @param status 订单状态（可选）
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @return 订单总数
     */
    long getAllOrderCount(String orderNo, Integer status, LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 根据状态查询订单列表
     * @param status 订单状态
     * @return 订单列表
     */
    List<Order> getOrdersByStatus(Integer status);
    
    /**
     * 查询用户在指定商家的订单数量
     * @param userId 用户ID
     * @param merchantId 商家ID
     * @return 订单数量
     */
    long getUserOrderCountByMerchant(Long userId, Long merchantId);
    
    /**
     * 查询指定时间范围内的订单统计
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param status 订单状态（可选）
     * @return 订单数量
     */
    long getOrderCountByTimeRange(LocalDateTime startTime, LocalDateTime endTime, Integer status);
    
    /**
     * 查询指定时间范围内的销售额统计
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param status 订单状态（可选）
     * @return 销售额
     */
    Double getSalesAmountByTimeRange(LocalDateTime startTime, LocalDateTime endTime, Integer status);
    
    /**
     * 查询商家指定时间范围内的订单统计
     * @param merchantId 商家ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param status 订单状态（可选）
     * @return 订单数量
     */
    long getMerchantOrderCountByTimeRange(Long merchantId, LocalDateTime startTime, LocalDateTime endTime, Integer status);
    
    /**
     * 查询商家指定时间范围内的销售额统计
     * @param merchantId 商家ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param status 订单状态（可选）
     * @return 销售额
     */
    Double getMerchantSalesAmountByTimeRange(Long merchantId, LocalDateTime startTime, LocalDateTime endTime, Integer status);
    
    /**
     * 生成订单号
     * @return 订单号
     */
    String generateOrderNo();
    
    /**
     * 检查订单是否可以取消
     * @param id 订单ID
     * @return 是否可以取消
     */
    boolean canCancelOrder(Long id);
    
    /**
     * 检查订单是否可以退款
     * @param id 订单ID
     * @return 是否可以退款
     */
    boolean canRefundOrder(Long id);
} 